<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/smp.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/smp.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfU01QX0hfMA__"><span class="b">_ASM_X86_SMP_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0FTTV9YODZfU01QX0hfMA__"><span class="b">_ASM_X86_SMP_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">__ASSEMBLY__</span>
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cpumask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">init</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="Maybe">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">percpu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="Maybe">       7:</span> 
<a name="8" /><span class="Maybe">       8:</span> <span class="k">/*</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> * We need the APIC definitions automatically as part of &apos;smp.h&apos;</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> */</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9MT0NBTF9BUElDXzA_"><span class="b">CONFIG_X86_LOCAL_APIC</span></a>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">mpspec</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">apic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span> <span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9JT19BUElDXzA_"><span class="b">CONFIG_X86_IO_APIC</span></a>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span>  <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">io_apic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span> <span class="n">endif</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="f">#</span><span class="n">endif</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">thread_info</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cpumask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cpufeature</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="21" /><span class="Maybe">      21:</span> 
<a name="22" /><span class="Maybe">      22:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">smp_num_siblings</span><span class="f">;</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">num_processors</span><span class="f">;</span>
<a name="24" /><span class="Maybe">      24:</span> 
<a name="25" /><span class="Maybe">      25:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">cpu_has_ht_siblings</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="f">{</span>
<a name="27" /><span class="Maybe">      27:</span>     <span class="m">bool</span> <span class="b">has_siblings</span> <span class="f">=</span> <span class="m">false</span><span class="f">;</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="29" /><span class="Maybe">      29:</span>     <span class="b">has_siblings</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_Y3B1X2hhc19odF8w"><span class="b">cpu_has_ht</span></a> <span class="f">&amp;&amp;</span> <span class="b">smp_num_siblings</span> <span class="f">&gt;</span> <span class="c">1</span><span class="f">;</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="f">#</span><span class="n">endif</span>
<a name="31" /><span class="Maybe">      31:</span>     <span class="m">return</span> <span class="b">has_siblings</span><span class="f">;</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="f">}</span>
<a name="33" /><span class="Maybe">      33:</span> 
<a name="34" /><span class="Maybe">      34:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">cpumask_var_t</span><span class="f">,</span> <span class="b">cpu_sibling_map</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">cpumask_var_t</span><span class="f">,</span> <span class="b">cpu_core_map</span><span class="f">)</span><span class="f">;</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="k">/* cpus sharing the last level cache: */</span>
<a name="37" /><span class="Maybe">      37:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">cpumask_var_t</span><span class="f">,</span> <span class="b">cpu_llc_shared_map</span><span class="f">)</span><span class="f">;</span>
<a name="38" /><span class="Maybe">      38:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">u16</span><span class="f">,</span> <span class="b">cpu_llc_id</span><span class="f">)</span><span class="f">;</span>
<a name="39" /><span class="Maybe">      39:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="m">int</span><span class="f">,</span> <span class="b">cpu_number</span><span class="f">)</span><span class="f">;</span>
<a name="40" /><span class="Maybe">      40:</span> 
<a name="41" /><span class="Maybe">      41:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpu_sibling_mask</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="f">{</span>
<a name="43" /><span class="Maybe">      43:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">cpu_sibling_map</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="f">}</span>
<a name="45" /><span class="Maybe">      45:</span> 
<a name="46" /><span class="Maybe">      46:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpu_core_mask</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="f">{</span>
<a name="48" /><span class="Maybe">      48:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">cpu_core_map</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="49" /><span class="Maybe">      49:</span> <span class="f">}</span>
<a name="50" /><span class="Maybe">      50:</span> 
<a name="51" /><span class="Maybe">      51:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpu_llc_shared_mask</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="f">{</span>
<a name="53" /><span class="Maybe">      53:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">cpu_llc_shared_map</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="f">}</span>
<a name="55" /><span class="Maybe">      55:</span> 
<a name="56" /><span class="Maybe">      56:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9FQVJMWV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_EARLY_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">u16</span><span class="f">,</span> <span class="b">x86_cpu_to_apicid</span><span class="f">)</span><span class="f">;</span>
<a name="57" /><span class="Maybe">      57:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9FQVJMWV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_EARLY_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="b">u16</span><span class="f">,</span> <span class="b">x86_bios_cpu_apicid</span><span class="f">)</span><span class="f">;</span>
<a name="58" /><span class="False">      58:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9MT0NBTF9BUElDXzA_"><span class="b">CONFIG_X86_LOCAL_APIC</span></a><span class="f">)</span> <span class="f">&amp;&amp;</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_X86_32</span><span class="f">)</span>
<a name="59" /><span class="False">      59:</span> <a href="cpu.c_macros_ref.html#_REVDTEFSRV9FQVJMWV9QRVJfQ1BVX1JFQURfTU9TVExZXzA_"><span class="b">DECLARE_EARLY_PER_CPU_READ_MOSTLY</span></a><span class="f">(</span><span class="m">int</span><span class="f">,</span> <span class="b">x86_cpu_to_logical_apicid</span><span class="f">)</span><span class="f">;</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">#</span><span class="n">endif</span>
<a name="61" /><span class="Maybe">      61:</span> 
<a name="62" /><span class="Maybe">      62:</span> <span class="k">/* Static state in head.S used to set up a CPU */</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">stack_start</span><span class="f">;</span> <span class="k">/* Initial stack pointer address */</span>
<a name="64" /><span class="Maybe">      64:</span> 
<a name="65" /><span class="Maybe">      65:</span> <span class="m">struct</span> <span class="b">task_struct</span><span class="f">;</span>
<a name="66" /><span class="Maybe">      66:</span> 
<a name="67" /><span class="Maybe">      67:</span> <span class="m">struct</span> <span class="b">smp_ops</span> <span class="f">{</span>
<a name="68" /><span class="Maybe">      68:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">smp_prepare_boot_cpu</span><span class="f">)</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="69" /><span class="Maybe">      69:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">smp_prepare_cpus</span><span class="f">)</span><span class="f">(</span><span class="m">unsigned</span> <span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="70" /><span class="Maybe">      70:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">smp_cpus_done</span><span class="f">)</span><span class="f">(</span><span class="m">unsigned</span> <span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="71" /><span class="Maybe">      71:</span> 
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">stop_other_cpus</span><span class="f">)</span><span class="f">(</span><span class="m">int</span> <span class="b">wait</span><span class="f">)</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">smp_send_reschedule</span><span class="f">)</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="74" /><span class="Maybe">      74:</span> 
<a name="75" /><span class="Maybe">      75:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">cpu_up</span><span class="f">)</span><span class="f">(</span><span class="m">unsigned</span> <span class="b">cpu</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tidle</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span>     <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">cpu_disable</span><span class="f">)</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">cpu_die</span><span class="f">)</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">play_dead</span><span class="f">)</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="79" /><span class="Maybe">      79:</span> 
<a name="80" /><span class="Maybe">      80:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">send_call_func_ipi</span><span class="f">)</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">mask</span><span class="f">)</span><span class="f">;</span>
<a name="81" /><span class="Maybe">      81:</span>     <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">send_call_func_single_ipi</span><span class="f">)</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="f">}</span><span class="f">;</span>
<a name="83" /><span class="Maybe">      83:</span> 
<a name="84" /><span class="Maybe">      84:</span> <span class="k">/* Globals due to paravirt */</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">set_cpu_sibling_map</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="86" /><span class="Maybe">      86:</span> 
<a name="87" /><span class="Maybe">      87:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="88" /><span class="Maybe">      88:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_PARAVIRT</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c3RhcnR1cF9pcGlfaG9va18w"><span class="b">startup_ipi_hook</span></a><span class="f">(</span><span class="b">phys_apicid</span><span class="f">,</span> <span class="b">start_eip</span><span class="f">,</span> <span class="b">start_esp</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="f">#</span><span class="n">endif</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">smp_ops</span> <span class="b">smp_ops</span><span class="f">;</span>
<a name="92" /><span class="Maybe">      92:</span> 
<a name="93" /><span class="Maybe">      93:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">smp_send_stop</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="f">{</span>
<a name="95" /><span class="Maybe">      95:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">stop_other_cpus</span><span class="f">(</span><span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="f">}</span>
<a name="97" /><span class="Maybe">      97:</span> 
<a name="98" /><span class="Maybe">      98:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">stop_other_cpus</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="f">{</span>
<a name="100" /><span class="Maybe">     100:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">stop_other_cpus</span><span class="f">(</span><span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="101" /><span class="Maybe">     101:</span> <span class="f">}</span>
<a name="102" /><span class="Maybe">     102:</span> 
<a name="103" /><span class="Maybe">     103:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">smp_prepare_boot_cpu</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="f">{</span>
<a name="105" /><span class="Maybe">     105:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">smp_prepare_boot_cpu</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="106" /><span class="Maybe">     106:</span> <span class="f">}</span>
<a name="107" /><span class="Maybe">     107:</span> 
<a name="108" /><span class="Maybe">     108:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">smp_prepare_cpus</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">max_cpus</span><span class="f">)</span>
<a name="109" /><span class="Maybe">     109:</span> <span class="f">{</span>
<a name="110" /><span class="Maybe">     110:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">smp_prepare_cpus</span><span class="f">(</span><span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="111" /><span class="Maybe">     111:</span> <span class="f">}</span>
<a name="112" /><span class="Maybe">     112:</span> 
<a name="113" /><span class="Maybe">     113:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">smp_cpus_done</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">max_cpus</span><span class="f">)</span>
<a name="114" /><span class="Maybe">     114:</span> <span class="f">{</span>
<a name="115" /><span class="Maybe">     115:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">smp_cpus_done</span><span class="f">(</span><span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="116" /><span class="Maybe">     116:</span> <span class="f">}</span>
<a name="117" /><span class="Maybe">     117:</span> 
<a name="118" /><span class="Maybe">     118:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">__cpu_up</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tidle</span><span class="f">)</span>
<a name="119" /><span class="Maybe">     119:</span> <span class="f">{</span>
<a name="120" /><span class="Maybe">     120:</span>     <span class="m">return</span> <span class="b">smp_ops</span><span class="f">.</span><span class="b">cpu_up</span><span class="f">(</span><span class="b">cpu</span><span class="f">,</span> <span class="b">tidle</span><span class="f">)</span><span class="f">;</span>
<a name="121" /><span class="Maybe">     121:</span> <span class="f">}</span>
<a name="122" /><span class="Maybe">     122:</span> 
<a name="123" /><span class="Maybe">     123:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">__cpu_disable</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="124" /><span class="Maybe">     124:</span> <span class="f">{</span>
<a name="125" /><span class="Maybe">     125:</span>     <span class="m">return</span> <span class="b">smp_ops</span><span class="f">.</span><span class="b">cpu_disable</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="126" /><span class="Maybe">     126:</span> <span class="f">}</span>
<a name="127" /><span class="Maybe">     127:</span> 
<a name="128" /><span class="Maybe">     128:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">__cpu_die</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="129" /><span class="Maybe">     129:</span> <span class="f">{</span>
<a name="130" /><span class="Maybe">     130:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">cpu_die</span><span class="f">(</span><span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="131" /><span class="Maybe">     131:</span> <span class="f">}</span>
<a name="132" /><span class="Maybe">     132:</span> 
<a name="133" /><span class="Maybe">     133:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">play_dead</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="134" /><span class="Maybe">     134:</span> <span class="f">{</span>
<a name="135" /><span class="Maybe">     135:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">play_dead</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="136" /><span class="Maybe">     136:</span> <span class="f">}</span>
<a name="137" /><span class="Maybe">     137:</span> 
<a name="138" /><span class="Maybe">     138:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">smp_send_reschedule</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="139" /><span class="Maybe">     139:</span> <span class="f">{</span>
<a name="140" /><span class="Maybe">     140:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">smp_send_reschedule</span><span class="f">(</span><span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="141" /><span class="Maybe">     141:</span> <span class="f">}</span>
<a name="142" /><span class="Maybe">     142:</span> 
<a name="143" /><span class="Maybe">     143:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">arch_send_call_function_single_ipi</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="f">{</span>
<a name="145" /><span class="Maybe">     145:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">send_call_func_single_ipi</span><span class="f">(</span><span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="146" /><span class="Maybe">     146:</span> <span class="f">}</span>
<a name="147" /><span class="Maybe">     147:</span> 
<a name="148" /><span class="Maybe">     148:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">arch_send_call_function_ipi_mask</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">mask</span><span class="f">)</span>
<a name="149" /><span class="Maybe">     149:</span> <span class="f">{</span>
<a name="150" /><span class="Maybe">     150:</span>     <span class="b">smp_ops</span><span class="f">.</span><span class="b">send_call_func_ipi</span><span class="f">(</span><span class="b">mask</span><span class="f">)</span><span class="f">;</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="f">}</span>
<a name="152" /><span class="Maybe">     152:</span> 
<a name="153" /><span class="Maybe">     153:</span> <span class="m">void</span> <span class="b">cpu_disable_common</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="m">void</span> <span class="b">native_smp_prepare_boot_cpu</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="m">void</span> <span class="b">native_smp_prepare_cpus</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="m">void</span> <span class="b">native_smp_cpus_done</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">max_cpus</span><span class="f">)</span><span class="f">;</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="m">int</span> <span class="b">native_cpu_up</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpunum</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">tidle</span><span class="f">)</span><span class="f">;</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="m">int</span> <span class="b">native_cpu_disable</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="m">void</span> <span class="b">native_cpu_die</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="m">void</span> <span class="b">native_play_dead</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="m">void</span> <span class="b">play_dead_common</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="m">void</span> <span class="b">wbinvd_on_cpu</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="m">int</span> <span class="b">wbinvd_on_all_cpus</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="164" /><span class="Maybe">     164:</span> 
<a name="165" /><span class="Maybe">     165:</span> <span class="m">void</span> <span class="b">native_send_call_func_ipi</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">mask</span><span class="f">)</span><span class="f">;</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="m">void</span> <span class="b">native_send_call_func_single_ipi</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="167" /><span class="Maybe">     167:</span> <span class="m">void</span> <span class="b">x86_idle_thread_init</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">idle</span><span class="f">)</span><span class="f">;</span>
<a name="168" /><span class="Maybe">     168:</span> 
<a name="169" /><span class="Maybe">     169:</span> <span class="m">void</span> <span class="b">smp_store_boot_cpu_info</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="m">void</span> <span class="b">smp_store_cpu_info</span><span class="f">(</span><span class="m">int</span> <span class="b">id</span><span class="f">)</span><span class="f">;</span>
<a name="171" /><span class="Maybe">     171:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y3B1X3BoeXNpY2FsX2lkXzA_"><span class="b">cpu_physical_id</span></a><span class="f">(</span><span class="b">cpu</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_cGVyX2NwdV8w"><span class="b">per_cpu</span></a><span class="f">(</span><span class="b">x86_cpu_to_apicid</span><span class="f">,</span> <span class="b">cpu</span><span class="f">)</span>
<a name="172" /><span class="Maybe">     172:</span> 
<a name="173" /><span class="False">     173:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* !CONFIG_SMP */</span>
<a name="174" /><span class="False">     174:</span> <span class="f">#</span><span class="n">define</span> <span class="b">wbinvd_on_cpu</span><span class="f">(</span><span class="b">cpu</span><span class="f">)</span>     <span class="b">wbinvd</span><span class="f">(</span><span class="f">)</span>
<a name="175" /><span class="False">     175:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">wbinvd_on_all_cpus</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="176" /><span class="False">     176:</span> <span class="f">{</span>
<a name="177" /><span class="False">     177:</span>     <span class="b">wbinvd</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="178" /><span class="False">     178:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="179" /><span class="False">     179:</span> <span class="f">}</span>
<a name="180" /><span class="Maybe">     180:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_SMP */</span>
<a name="181" /><span class="Maybe">     181:</span> 
<a name="182" /><span class="Maybe">     182:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="b">disabled_cpus</span><span class="f">;</span>
<a name="183" /><span class="Maybe">     183:</span> 
<a name="184" /><span class="False">     184:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32_SMP</span>
<a name="185" /><span class="False">     185:</span> <span class="k">/*</span>
<a name="186" /><span class="False">     186:</span> <span class="k"> * This function is needed by all SMP systems. It must _always_ be valid</span>
<a name="187" /><span class="False">     187:</span> <span class="k"> * from the initial startup. We map APIC_BASE very early in page_setup(),</span>
<a name="188" /><span class="False">     188:</span> <span class="k"> * so this is correct in the x86 case.</span>
<a name="189" /><span class="False">     189:</span> <span class="k"> */</span>
<a name="190" /><span class="False">     190:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cmF3X3NtcF9wcm9jZXNzb3JfaWRfMA__"><span class="b">raw_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dGhpc19jcHVfcmVhZF8w"><span class="b">this_cpu_read</span></a><span class="f">(</span><span class="b">cpu_number</span><span class="f">)</span><span class="f">)</span>
<a name="191" /><span class="False">     191:</span> <span class="m">extern</span> <span class="m">int</span> <a href="cpu.c_macros_noref.html#_c2FmZV9zbXBfcHJvY2Vzc29yX2lkXzA_"><span class="b">safe_smp_processor_id</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="192" /><span class="False">     192:</span> 
<a name="193" /><span class="Maybe">     193:</span> <span class="f">#</span><span class="n">elif</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl82NF9TTVBfMA__"><span class="b">CONFIG_X86_64_SMP</span></a><span class="f">)</span>
<a name="194" /><span class="Maybe">     194:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cmF3X3NtcF9wcm9jZXNzb3JfaWRfMA__"><span class="b">raw_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dGhpc19jcHVfcmVhZF8w"><span class="b">this_cpu_read</span></a><span class="f">(</span><span class="b">cpu_number</span><span class="f">)</span><span class="f">)</span>
<a name="195" /><span class="Maybe">     195:</span> 
<a name="196" /><span class="Maybe">     196:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c3RhY2tfc21wX3Byb2Nlc3Nvcl9pZF8w"><span class="b">stack_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span>                    \
<a name="197" /><span class="Maybe">     197:</span> <span class="f">(</span><span class="f">{</span>                                \
<a name="198" /><span class="Maybe">     198:</span>     <span class="m">struct</span> <span class="b">thread_info</span> <span class="f">*</span><span class="b">ti</span><span class="f">;</span>                        \
<a name="199" /><span class="Maybe">     199:</span>     <span class="b">__asm__</span><span class="f">(</span><span class="e">&quot;andq %%rsp,%0; &quot;</span><span class="f">:</span><span class="e">&quot;=r&quot;</span> <span class="f">(</span><span class="b">ti</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><a href="cpu.c_macros_noref.html#_Q1VSUkVOVF9NQVNLXzA_"><span class="b">CURRENT_MASK</span></a><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="200" /><span class="Maybe">     200:</span>     <span class="b">ti</span><span class="f">-&gt;</span><span class="b">cpu</span><span class="f">;</span>                            \
<a name="201" /><span class="Maybe">     201:</span> <span class="f">}</span><span class="f">)</span>
<a name="202" /><span class="Maybe">     202:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c2FmZV9zbXBfcHJvY2Vzc29yX2lkXzA_"><span class="b">safe_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span>        <a href="cpu.c_macros_noref.html#_c21wX3Byb2Nlc3Nvcl9pZF8w"><span class="b">smp_processor_id</span></a><span class="f">(</span><span class="f">)</span>
<a name="203" /><span class="Maybe">     203:</span> 
<a name="204" /><span class="Maybe">     204:</span> <span class="f">#</span><span class="n">endif</span>
<a name="205" /><span class="Maybe">     205:</span> 
<a name="206" /><span class="Maybe">     206:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl9MT0NBTF9BUElDXzA_"><span class="b">CONFIG_X86_LOCAL_APIC</span></a>
<a name="207" /><span class="Maybe">     207:</span> 
<a name="208" /><span class="False">     208:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1g4Nl82NF8w"><span class="b">CONFIG_X86_64</span></a>
<a name="209" /><span class="False">     209:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">logical_smp_processor_id</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="210" /><span class="False">     210:</span> <span class="f">{</span>
<a name="211" /><span class="False">     211:</span>     <span class="k">/* we don&apos;t want to mark this access volatile - bad code generation */</span>
<a name="212" /><span class="False">     212:</span>     <span class="m">return</span> <a href="cpu.c_macros_noref.html#_R0VUX0FQSUNfTE9HSUNBTF9JRF8w"><span class="b">GET_APIC_LOGICAL_ID</span></a><span class="f">(</span><span class="b">apic_read</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_QVBJQ19MRFJfMA__"><span class="b">APIC_LDR</span></a><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="213" /><span class="False">     213:</span> <span class="f">}</span>
<a name="214" /><span class="False">     214:</span> 
<a name="215" /><span class="Maybe">     215:</span> <span class="f">#</span><span class="n">endif</span>
<a name="216" /><span class="Maybe">     216:</span> 
<a name="217" /><span class="Maybe">     217:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">hard_smp_processor_id</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="218" /><span class="Maybe">     218:</span> 
<a name="219" /><span class="False">     219:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* CONFIG_X86_LOCAL_APIC */</span>
<a name="220" /><span class="False">     220:</span> 
<a name="221" /><span class="False">     221:</span> <span class="f">#</span> <span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="222" /><span class="False">     222:</span> <span class="f">#</span>  <span class="n">define</span> <span class="b">hard_smp_processor_id</span><span class="f">(</span><span class="f">)</span>    <span class="c">0</span>
<a name="223" /><span class="False">     223:</span> <span class="f">#</span> <span class="n">endif</span>
<a name="224" /><span class="False">     224:</span> 
<a name="225" /><span class="Maybe">     225:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_X86_LOCAL_APIC */</span>
<a name="226" /><span class="Maybe">     226:</span> 
<a name="227" /><span class="False">     227:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_DEBUG_NMI_SELFTEST</span>
<a name="228" /><span class="False">     228:</span> <span class="m">extern</span> <span class="m">void</span> <a href="cpu.c_macros_noref.html#_bm1pX3NlbGZ0ZXN0XzA_"><span class="b">nmi_selftest</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="229" /><span class="Maybe">     229:</span> <span class="f">#</span><span class="n">else</span>
<a name="230" /><span class="Maybe">     230:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bm1pX3NlbGZ0ZXN0XzA_"><span class="b">nmi_selftest</span></a><span class="f">(</span><span class="f">)</span> <span class="m">do</span> <span class="f">{</span> <span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="231" /><span class="Maybe">     231:</span> <span class="f">#</span><span class="n">endif</span>
<a name="232" /><span class="Maybe">     232:</span> 
<a name="233" /><span class="Maybe">     233:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __ASSEMBLY__ */</span>
<a name="234" /><span class="True">     234:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _ASM_X86_SMP_H */</span>
<a name="235" /><span class="True">     235:</span> </pre>
  </body>
</html>
